package com.cloud.servicezuul.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.cloud.servicezuul.fallback.SentinelBlockHandle;
import com.cloud.servicezuul.service.TestSentinelService;
import org.springframework.stereotype.Service;

/**
 * 这里是测试 Sentinel 的注解方式实现，
 *  需要注意的是 blockHandel 中的方法 需要传入异常，否则会报错
 */
@Service
public class SentinelServiceImpl implements TestSentinelService {


    @Override
    // 这里使用 sentinel 的限流，如果没有指定blockHandlerClass ，那么限流的方法就在本类里面实现
    @SentinelResource(value = "service-sms",blockHandler = "failMethod")
    public String testSentinelAnn() {
        System.out.println("正常的业务逻辑");
        return "正常的业务逻辑";
    }

    /**
     * 这里如果要配置 处理限流逻辑的类，那么也需要指定限流指定的方法
     * @return 业务数据
     */
    @Override
    // 使用sentinel的注解进行限流，value 是令牌桶名称，blockHandlerClass 是处理限流逻辑的类，blockHandler 是处理该方法限流的方法名称
    @SentinelResource(value = "service-sms",blockHandlerClass = SentinelBlockHandle.class,blockHandler = "testSentinelBlockHandleClass")
    public String testSentinelBlockHandleClass() {
        System.out.println("正常的业务逻辑");
        return "正常的业务逻辑";
    }

    public String failMethod(BlockException be){
        System.out.println("被限流了");
        return "被限流了";
    }
}
